<?php
// +----------------------------------------------------------------------
// | ThinkPHP
// +----------------------------------------------------------------------
// | Copyright (c) 2008 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// $Id$

function thinkDispatcher() {
	// 应用调度过滤器
	// 如果没有加载任何URL调度器
	// 默认只支持 QUERY_STRING 方式
	// 例如 ?m=user&a=add
	if(C('DISPATCH_ON') && C('DISPATCH_NAME')=='Think') {
		// 使用内置的Dispatcher调度器
		Think::import('Think.Util.Dispatcher');
		Dispatcher::dispatch();
	}
	// 取得模块和操作名称 如果有伪装 则返回真实的名称
	// 可以在Dispatcher中定义获取规则
	define('MODULE_NAME',   getModule());       // Module名称
	define('ACTION_NAME',   getAction());        // Action操作
	if(!defined('PHP_FILE')) {
		// PHP_FILE 由内置的Dispacher定义
		// 如果不使用该插件，需要重新定义
		define('PHP_FILE',_PHP_FILE_);
	}
}

/**
 +----------------------------------------------------------
 * 获得实际的模块名称
 +----------------------------------------------------------
 * @access private
 +----------------------------------------------------------
 * @return string
 +----------------------------------------------------------
 */
function getModule()
{
    $var	=	C('VAR_MODULE');
    $module = isset($_POST[$var]) ? $_POST[$var] : (isset($_GET[$var])? $_GET[$var]:'');
    // 如果 $module 为空，则赋予默认值
    if (empty($module)) $module = C('DEFAULT_MODULE');
    // 检查组件模块
	if(strpos($module,C('COMPONENT_DEPR'))) {
        // 记录完整的模块名
        define('C_MODULE_NAME',$module);
        $array	=	explode(C('COMPONENT_DEPR'),$module);
        // 实际模块名称
        $module	=	array_pop($array);
        // 获取组件名称
        if(1==count($array)) {
           define('COMPONENT_NAME',$array[0]);
        }else{
            define('COMPONENT_NAME',implode('/',$array));
        }
    }
    // 检查模块URL伪装
    if(C('MODULE_REDIRECT')) {
        $res = preg_replace('@(\w+):([^,\/]+)@e', '$modules[\'\\1\']="\\2";', C('MODULE_REDIRECT'));
        if(array_key_exists($module,$modules)) {
            // 记录伪装的模块名称
            define('P_MODULE_NAME',$module);
            $module	=	$modules[$module];
        }
    }
    if(C('URL_CASE_INSENSITIVE')) {
        // URL地址不区分大小写
        $module = ucwords(strtolower($module));
    }
	return $module;
}

/**
 +----------------------------------------------------------
 * 获得实际的操作名称
 +----------------------------------------------------------
 * @access private
 +----------------------------------------------------------
 * @return string
 +----------------------------------------------------------
 */
function getAction()
{
	$var	=	C('VAR_ACTION');
	$action   = isset($_POST[$var]) ? $_POST[$var] : (isset($_GET[$var])?$_GET[$var]:'');
	// 如果 $action 为空，则赋予默认值
	if (empty($action)) $action = C('DEFAULT_ACTION');
	// 检查操作链
	if(strpos($action,':')) {
		// 记录完整的模块名
		define('C_ACTION_NAME',$action);
		$array	=	explode(':',$action);
		// 实际的模块名称
		$action	=	array_pop($array);
	}
	// 检查操作URL伪装
	if(C('ACTION_REDIRECT')) {
		$res = preg_replace('@(\w+):([^,\/]+)@e', '$actions[\'\\1\']="\\2";', C('ACTION_REDIRECT'));
		if(array_key_exists($action,$actions)) {
			// 记录伪装的操作名称
			define('P_ACTION_NAME',$action);
			$action	=	$actions[$action];
		}
	}
	return $action;
}
Tag::add('app_init','thinkDispatcher');
?>